Verižni razlomci

In [1]:
import math

def continuous_fraction(x, limit = 8):
    x_ = x
    a_ = math.floor(x)
    
    res = [a_]
    
    for _ in range(limit):
        try:
            a_ = res[-1]
            x = 1 / (x_ - a_)
            x_ = x
            a = math.floor(x)
            res.append(a)
        except:
            break
        
    return res    
In [2]:
# Primer
continuous_fraction(math.pi)
Out[2]:
[3, 7, 15, 1, 292, 1, 1, 1, 2]
In [3]:
def cont_to_rational(cont_frac):
    n = len(cont_frac)
    
    p_ = 0
    q_ = 1
    
    for i in range(n-1, -1, -1):
        a = cont_frac[i]
        q = a * q_ + p_
        p = q_
        p_ = p
        q_ = q
        
    return (q, p)
In [8]:
# Primer 
cont = continuous_fraction(22/7, 1)
frac = cont_to_rational(cont)
print(frac)
(p, q) = frac
print(p / q)
(22, 7)
3.142857142857143